#ifndef BOXINIT_H
#define BOXINIT_H

#include <QThread>
#include <gheaders.h>
#include <tcp_routines.h>
#include <QErrorMessage>
#include <stdio.h>
#include <dirent.h>
#include <stdlib.h>
#include <fcntl.h>
#include <QDir>
#include <sys/types.h>
#include <unistd.h>
#include <QFile>
#include <QTextStream>
#include <QString>
#include <iostream>
#include <QMap>
#include <QStringList>
#include <sys/stat.h>
#include "forceOffline.h"
using namespace std;

class Initer:public QThread
{
    Q_OBJECT
private:
    QString homeDir;                  //用户的主目录
    QString userName;                 //用户名
    int ctl_sock;                     //控制信息传送的socket所用的文件描述符
    QMap<QString,QString> initFliter; //处理函数用的map，用来过滤开始的日志
    QMap<QString,int> IconMap;
public:
    ForceOffLine** FL;
    Initer(QString HD,QString UN,int ctl,ForceOffLine** FOL);
    void decode_path(const char* from, char* to);    //转换服务器与客户端之间的path
    void pull_file(const char* serverPath, const char *path);
    void setEmblemForDir(QString);
    void setIconUpdate(QString filename);             //设置图标为同步中
    void setIconFinished(QString filename);           //设置图标为同步完成
    void rmDirFromMap(const char *);          //如果是删除一个文件夹事件，递归的将文件夹中在map（用于记录最后有那些文件要下载）中的
                                              //文件从map中删除
    void mvDirFromMap(const char *,const char *);  //  如果是移动一个文件夹事件，递归的将文件夹中在map（用于记录最后有那些文件要下载）中的
                                                   //文件进行重命名
    void run();
    int dfs_rmdir(const char*);                     //递归删除文件夹函数
    void SearchFile(QString);                       //当一个文件在更新时候，为他和他的父目录添加更新标志
    void rmFromIconMap(QString);                    //把一个文件设置成更新完成，同时判断是否需要将他的父目录设置为更新完成
    long countSizeForDir(const char* name);
    long countSizeForFile(const char* name);
    QString pathToServerPath(QString filePath);
signals:
    void startInit();                               //开始初始化信号
    void initFinished();                            //初始化完成信号
    void upVersion(int);                            //同步本地和服务器版本号信号
    void sizeChanged(long);                         //告诉controller大小改变了
    void ForceOffLineWatchStart();
};

#endif // BOXINIT_H
